package com.wzh.design.proxy.cglib2;

import net.sf.cglib.proxy.Enhancer;

import net.sf.cglib.proxy.FixedValue;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.junit.Test;

import java.lang.reflect.Method;

/**
 * @description:
 * @author: WZH
 * @time: 2021/6/9 16:10
 */
public class SampleClass {

    public void test(){
        System.out.println("hello world");
    }

    /**
     *     Enhancer
     *     Enhancer可能是CGLIB中最常用的一个类，和Java1.3
     *
     *     动态代理中引入的Proxy类差不多。和Proxy不同的是，
     *     Enhancer既能够代理普通的class，也能够代理接口。Enhancer创建一个被代理对象的子类并且拦截所有的方法调用（包括从Object中继承的toString和hashCode方法）。
     *     Enhancer不能够拦截final方法，例如Object.getClass()方法，
     *     这是由于Java final方法语义决定的。基于同样的道理，Enhancer也不能对fianl类进行代理操作。
     *     这也是Hibernate为什么不能持久化final class的原因。
     *
     */

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(SampleClass.class);
        enhancer.setCallback(new MethodInterceptor() {

            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                System.out.println("before method run...");
                Object result = proxy.invokeSuper(obj, args);
                System.out.println("after method run...");
                return result;
            }
        });
        SampleClass sample = (SampleClass) enhancer.create();
        sample.test();
    }




}